package pay.weixin.demo;

import pay.config.WeixinConfig;
import pay.weixin.bean.WXPayRefund;
import pay.weixin.utils.MD5Util;

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

/**
 * 商户微信支付配置
 * @author iYjrg_xiebin
 * @date 2016年5月24日下午2:52:25
 */
public class WeixinPay {
    //http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
    //商户Key：改成公司申请的即可
    //32位密码设置地址：http://www.sexauth.com/  12341hvufnm1sdcb0e81t36k0d0f15nc


//    /**
//     * 随即字符串
//     * @param length
//     * @return
//     */
//    public static String getRandomString(int length) { //length表示生成字符串的长度
//        String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
//        Random random = new Random();
//        StringBuffer sb = new StringBuffer();
//        int number = 0;
//        for (int i = 0; i < length; i++) {
//            number = random.nextInt(base.length());
//            sb.append(base.charAt(number));
//        }
//        return sb.toString();
//    }

    /**
     * 微信支付签名算法sign
     * @param characterEncoding
     * @param parameters
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static String createSign2(String characterEncoding,SortedMap<Object,Object> parameters){
        StringBuffer sb = new StringBuffer();
        Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序（升序）
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            Object v = entry.getValue();
            if(null != v && !"".equals(v)
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + WeixinConfig.apiKey);
        System.out.println("字符串拼接后是："+sb.toString());
        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
        return sign;
    }


   //不能用
    public static String xmlInfo(WXPayRefund refund){
        //构造xml参数的时候，至少又是个必传参数
        /*
         * <xml>
               <appid>wx2421b1c4370ec43b</appid>
               <mch_id>10000100</mch_id>
               <nonce_str>6cefdb308e1e2e8aabd48cf79e546a02</nonce_str>
               <op_user_id>10000100</op_user_id>
               <out_refund_no>1415701182</out_refund_no>
               <out_trade_no>1415757673</out_trade_no>
               <refund_fee>1</refund_fee>
               <total_fee>1</total_fee>
               <transaction_id></transaction_id>
               <sign>FE56DD4AA85C0EECA82C35595A69E153</sign>
            </xml>
         */

        if(refund!=null){
            StringBuffer bf = new StringBuffer();
            bf.append("<xml>");

            bf.append("<appid><![CDATA[");
            bf.append(refund.getAppid());
            bf.append("]]></appid>");

            bf.append("<mch_id><![CDATA[");
            bf.append(refund.getMch_id());
            bf.append("]]></mch_id>");

            bf.append("<nonce_str><![CDATA[");
            bf.append(refund.getNonce_str());
            bf.append("]]></nonce_str>");

            bf.append("<sign><![CDATA[");
            bf.append(refund.getSign());
            bf.append("]]></sign>");

            bf.append("<op_user_id><![CDATA[");
            bf.append(refund.getOp_user_id());
            bf.append("]]></op_user_id>");
//
//            bf.append("<transaction_id><![CDATA[");
//            bf.append(refund.getTransaction_id());
//            bf.append("]]></transaction_id>");
            bf.append("<out_trade_no><![CDATA[");
            bf.append(refund.getOut_refund_no());
            bf.append("]]></out_trade_no>");

            bf.append("<out_refund_no><![CDATA[");
            bf.append(refund.getOut_refund_no());
            bf.append("]]></out_refund_no>");

            bf.append("<total_fee><![CDATA[");
            bf.append(refund.getTotal_fee());
            bf.append("]]></total_fee>");

            bf.append("<refund_fee><![CDATA[");
            bf.append(refund.getRefund_fee());
            bf.append("]]></refund_fee>");

            bf.append("</xml>");
            return bf.toString();
        }

        return "";
    }


    //可以用
    public static String xmlInfo2(WXPayRefund refund){
        //构造xml参数的时候，至少又是个必传参数
        /*
         * <xml>
               <appid>wx2421b1c4370ec43b</appid>
               <mch_id>10000100</mch_id>
               <nonce_str>6cefdb308e1e2e8aabd48cf79e546a02</nonce_str>
               <op_user_id>10000100</op_user_id>
               <out_refund_no>1415701182</out_refund_no>
               <out_trade_no>1415757673</out_trade_no>
               <refund_fee>1</refund_fee>
               <total_fee>1</total_fee>
               <transaction_id></transaction_id>
               <sign>FE56DD4AA85C0EECA82C35595A69E153</sign>
            </xml>
         */

        if(refund!=null){
            StringBuffer bf = new StringBuffer();
            bf.append("<xml>");

            bf.append("<appid>");
            bf.append(refund.getAppid());
            bf.append("</appid>");

            bf.append("<mch_id>");
            bf.append(refund.getMch_id());
            bf.append("</mch_id>");

            bf.append("<nonce_str>");
            bf.append(refund.getNonce_str());
            bf.append("</nonce_str>");



            bf.append("<op_user_id>");
            bf.append(refund.getOp_user_id());
            bf.append("</op_user_id>");
//
//            bf.append("<transaction_id><![CDATA[");
//            bf.append(refund.getTransaction_id());
//            bf.append("]]></transaction_id>");

            bf.append("<out_refund_no>");
            bf.append(refund.getOut_refund_no());
            bf.append("</out_refund_no>");


            bf.append("<out_trade_no>");
            bf.append(refund.getOut_trade_no());
            bf.append("</out_trade_no>");



            bf.append("<refund_fee>");
            bf.append(refund.getRefund_fee());
            bf.append("</refund_fee>");

            bf.append("<total_fee>");
            bf.append(refund.getTotal_fee());
            bf.append("</total_fee>");


            bf.append("<sign>");
            bf.append(refund.getSign());
            bf.append("</sign>");

            bf.append("</xml>");
            return bf.toString();
        }

        return "";
    }

    /**
     * post请求并得到返回结果
     * @param requestUrl
     * @param requestMethod
     * @param output
     * @return
     */
    public static String httpsRequest(String requestUrl, String requestMethod, String output) {
        try{
            URL url = new URL(requestUrl);
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setRequestMethod(requestMethod);
            if (null != output) {
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(output.getBytes("UTF-8"));
                outputStream.close();
            }
            // 从输入流读取返回内容
            InputStream inputStream = connection.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            connection.disconnect();
            return buffer.toString();
        }catch(Exception ex){
            ex.printStackTrace();
        }

        return "";
    }

//    /**
//     * 解析退款申请
//     * 解析的时候自动去掉CDMA
//     * @param xml
//     */
//    @SuppressWarnings("unchecked")
//    public static WXPayRefundResult getUnifiedorderResult(String xml){
//        WXPayRefundResult unifieorderResult = new WXPayRefundResult();
//        try {
//            StringReader read = new StringReader(xml);
//            // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
//            InputSource source = new InputSource(read);
//            // 创建一个新的SAXBuilder
//            SAXBuilder sb = new SAXBuilder();
//            // 通过输入源构造一个Document
//            Document doc;
//            doc = (Document) sb.build(source);
//
//            Element root = doc.getRootElement();// 指向根节点
//            List<Element> list = root.getChildren();
//
//            if(list!=null&&list.size()>0){
//                for (Element element : list) {
//                    System.out.println("key是："+element.getName()+"，值是："+element.getText());
//                    if("return_code".equals(element.getName())){
//                        unifieorderResult.setReturn_code(element.getText());
//                    }
//
//                    if("return_msg".equals(element.getName())){
//                        unifieorderResult.setReturn_msg(element.getText());
//                    }
//
//                    if("result_code".equals(element.getName())){
//                        unifieorderResult.setResult_code(element.getText());
//                    }
//                }
//            }
//
//        } catch (JDOMException e) {
//            e.printStackTrace();
//        }  catch (IOException e) {
//            e.printStackTrace();
//        }catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return unifieorderResult;
//    }

}

